package java_thinking.unit_16;

import java_thinking.net.mindview.util.Generated;
import java_thinking.unit_15._15_3.Generator;

import java.util.Arrays;
import java.util.Random;

/**
 * @Desc:   数组元素的比较
 *          程序设计的基本目标是:"将保持不变的事物与会发生改变的事物相分离",而这里,不变的是通用的排序算法,
 *          变化的是各种对象相互比较的方式,因此不是将比较不同的代码编写成不容的子程序,而是使用策略设计模式.
 *          通过使用策略,可以将"会发生变化的代码"封装在单例的类中(策略对象),
 *
 *          java有两种方式,一个是实现Comparable,一种是创建Comparator实现(一般为匿名实现)
 * @author: cww
 * @DateTime: 2019-04-09 22:09
 */

/**
 * 这里实现Comparable类主要是为了实现compare方法，因为Arrays.sort的源码中需要将对象转为Comparable对象进行
 * compareTo方法比较，如果没有实现Comparable则会抛出Class cannot be cast to java.lang.Comparable
 */
public class _7_3_1CompType implements Comparable<_7_3_1CompType> {
    int i;
    int j;
    private static int count = 1;
    public _7_3_1CompType(int n1,int n2) {
        i = n1;
        j = n2;
    }

    @Override
    public String toString() {
        String result = "{i=" + i +", j=" + j +'}';
        if (count++ % 3 ==0){
            result +="\n";
        }
        return result;
    }

    /**
     * 这里只对i做了排序
     * @param o
     * @return
     */
    @Override
    public int compareTo(_7_3_1CompType o) {
        return (i<o.i?-1:(i == o.i?0:1));
    }
    private static Random r = new Random(47);
    public static Generator<_7_3_1CompType> generator() {
        return new Generator<_7_3_1CompType>() {
            @Override
            public _7_3_1CompType next() {
                return new _7_3_1CompType(r.nextInt(100),r.nextInt(100));
            }
        };
    }

    public static void main(String[] args) {
        _7_3_1CompType[] a = Generated.array(new _7_3_1CompType[12],generator());
        System.out.println(Arrays.toString(a));
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));
    }
}
